﻿namespace StockSharp.Algo.Indicators.Misc
{
	/// <summary>
	/// Полный класс линейной регрессии, считает одновременно LinearReg, LinearRegSlope, RSquared и StandardError.
	/// </summary>
	public class LinearRegression : BaseComplexIndicator
	{
		/// <summary>
		/// Создать <see cref="LinearRegression"/>.
		/// </summary>
		public LinearRegression()
			: this(new LinearReg(), new RSquared(), new LinearRegSlope(), new StandardError())
		{
		}

		///<summary>
		/// Создать <see cref="LinearRegression"/>.
		///</summary>
		///<param name="linearReg">Линейная регрессия.</param>
		///<param name="rSquared">R-квадрат регрессии.</param>
		///<param name="regSlope">Коэффициент при независимой переменной, угол наклона прямой.</param>
		///<param name="standardError">Стандартная ошибка.</param>
		public LinearRegression(LinearReg linearReg, RSquared rSquared, LinearRegSlope regSlope, StandardError standardError)
			: base(linearReg, rSquared, regSlope, standardError)
		{
			LinearReg = linearReg;
			RSquared = rSquared;
			LinearRegSlope = regSlope;
			StandardError = standardError;

			Mode = ComplexIndicatorModes.Parallel;
		}

		private int _length;

		///<summary>
		/// Длина периода.
		///</summary>
		public int Length
		{
			get { return _length; }
			set
			{
				_length = value;

				LinearReg.Length = _length;
				RSquared.Length = _length;
				LinearRegSlope.Length = _length;
				StandardError.Length = _length;

				Reset();
			}
		}

		/// <summary>
		/// Линейная регрессия.
		/// </summary>
		public LinearReg LinearReg { get; private set; }

		/// <summary>
		/// R-квадрат регрессии.
		/// </summary>
		public RSquared RSquared { get; private set; }

		/// <summary>
		/// Стандартная ошибка.
		/// </summary>
		public StandardError StandardError { get; private set; }

		/// <summary>
		/// Коэффициент при независимой переменной, угол наклона прямой.
		/// </summary>
		public LinearRegSlope LinearRegSlope { get; private set; }
	}
}